package com.zxq.ai.domain.activity;

import com.zxq.common.utils.DateUtil;
import com.zxq.common.utils.NullUtil;
import com.zxq.ai.domain.AggregateRoot;
import com.zxq.ai.domain.enums.ActivityType;
import com.zxq.ai.domain.enums.ActivityStatus;
import com.zxq.ai.domain.enums.RewardStrategy;
import com.zxq.ai.domain.enums.RewardType;
import com.zxq.ai.domain.exception.ActivityHasEndedException;
import com.zxq.ai.domain.exception.ActivityIllegalityException;
import com.zxq.ai.domain.reward.RewardCondition;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * 活动：创建、更新、删除营销活动，管理活动规则。
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public abstract class Activity implements AggregateRoot<Long>, IActivityManager, IActivityParticipant {

    private Long activityId;
    private String activityName;
    private String activityDesc;
    private Long ownerUserId;  // 活动所有者ID userId
    private ActivityStatus activityStatus;  // 活动状态：初始化 -> 进行中 <=> 暂停中 -> 终止
    private Long createAt;  // 创建时间
    private String createBy;  // 创建人 userId
    private Long updateAt;  // 更新时间
    private String updateBy;  // 更新人

    /////////////////////////////////////////////////////////////////////////
    /**
     * 活动参与者 限制
     */


    /////////////////////////////////////////////////////////////////////////
    /**
     * 活动内容的 限制 SMART：
     * Specific（具体的）、Measurable（可衡量的）、Achievable（可实现的）、Relevant（相关的）和 Time-bound（有时间限制的）
     *
     */
    private Long startTime; // 起始时间
    private Long endTime;  // 截止时间

    /////////////////////////////////////////////////////////////////////////
    /**
     * 活动奖励的 限制
     */
    private RewardCondition rewardCondition; // 获奖条件
    private RewardStrategy rewardStrategy;  // 奖励发放策略
    private Integer rewardNum;  // 获奖名额限制
    private Integer rewardCount;  // 当前已发放的奖励名额数
    private RewardType rewardType;  // 奖励类型
    private Integer rewardAmount;  // 单份奖励额度


    /////////////////////////////////////////////////////////////////////////
    /**
     * 活动ID
     * @return String
     */
    @Override
    public Long id() {
        return activityId;
    }

    /**
     * 定义活动类型
     * @return ActivityType
     */
    public abstract ActivityType getActivityType();

    /**
     * 活动有效性校验
     */
    public void validityChecking() {
        if (id() == null) {
            throw new ActivityIllegalityException("活动ID为空，不合法的活动");
        }
        if (getEndTime() == null) {
            throw new ActivityIllegalityException(String.format("活动[%s]未设置结束时间，活动异常", getActivityId()));
        }
        if (NullUtil.defaultIfNull(getEndTime(), 0L) < DateUtil.millis()) {
            throw new ActivityHasEndedException(String.format("活动[%s]已结束", getActivityId()));
        }

        if (NullUtil.defaultIfNull(getRewardCount(), 0) >= NullUtil.defaultIfNull(getRewardNum(), 0)) {
            throw new ActivityHasEndedException(String.format("来晚啦~ 活动[%s]奖励已经被抢光了", getActivityId()));
        }
    }
    ////////////////////////////////// IActivityManager ///////////////////////////////////////
    @Override
    public void startActivity() {
        this.activityStatus = ActivityStatus.ACTIVE;
    }

    @Override
    public void pauseActivity() {
        this.activityStatus = ActivityStatus.SUSPEND;
    }

    @Override
    public void stopActivity() {
        this.activityStatus = ActivityStatus.TERMINATE;
    }


    ///////////////////////////////// IActivityParticipant ////////////////////////////////////////


}
